<?php
/**
 * @author Artur Bier <izatop@gmail.com>
 * @package Misc
 *
 * @copyright TinyWEB CMS
 * @link http://tinywebcms.ru
 * @link http://cms.vingrad.ru
 * @version SVN: $Id$ 
 */

/**
 * Класс собдержащий набор статических методов
 * которые заменят в PHP функции не умеющие работать в кодировке UTF-8.
 */
class UtfFunctions extends Object 
{
    
    /**
     * Гипер-супер-имитатор wordwrap под UTF-8.
     * 
     * @author Arthur F. Bier <abir@rbc.ru>
     *
     * @param string $string
     * @param int $max
     * @param string $break
     * @param boolean $cut
     * @return string
     */
    public static function wordwrap($string, $max, $break = ' ', $cut = 0) {
        //if($cut) $string = mb_substr($string, 0, $max);
        for ($i = 0, $local = explode(' ', $string),
            $length = mb_strlen($local[$i]), $breaksz = mb_strlen($break); 
            $i < sizeof($local); $length = @mb_strlen($local[$i+1]), $i++
        ) {
            if($length > $max && (mb_strpos($local[$i],'http')===false))
                for ($j = $max; $j < $length; $j += $max+$breaksz)
                    $local[$i]  = mb_substr($local[$i], 0, $j) . $break . 
                        mb_substr($local[$i], $j);
                //$local[$i]  = preg_replace("/.{0,$max}/uis", "\\0$break", $local[$i]);
        }
        
        $str = implode(' ', $local);
        
        if($cut && $cut < mb_strlen($str)) {
            return mb_substr($str, 0, $cut) . '...';
        }
        return $str;
    }

    /**
     * Детект UTF-8.
     *
     * @param string $string
     * @return bool
     */
    public static function isUTF8($string) {
       return preg_match('%(?:
           [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
           |\xE0[\xA0-\xBF][\x80-\xBF]              # excluding overlongs
           |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
           |\xED[\x80-\x9F][\x80-\xBF]              # excluding surrogates
           |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
           |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
           |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
           )+%xs', $string
       );
    }

    public static function urldecode($str) {
        $str = rawurldecode($str);
        if (!self::isUTF8($str)) {
        	$str = mb_convert_encoding($str, CFG_CURRENT_CHARSET, 'windows-1251');
        }
        return $str;
    }
}

/**
 * alias for UtfFunctions::wordwrap
 */ 
function utf8wordwrap($string, $max, $break, $cut = false)
{
    return UtfFunctions::wordwrap($string, $max, $break, $cut);
}

?>